package a_12届蓝桥真题;
/*
给定一个括号序列，要求尽可能少地添加若干括号使得括号序列变得合法，当添加完成后，会产生不同的添加结果，请问有多少种本质不同的添加结果。
两个结果是本质不同的是指存在某个位置一个结果是左括号，而另一个是右括号。
例如，对于括号序列 ((()，只需要添加两个括号就能让其合法，有以下几种不同的添加结果：()()()、()(())、(())()、(()()) 和 ((()))。

输入格式
输入一行包含一个字符串 s，表示给定的括号序列，序列中只有左括号和右括号。

输出格式
输出一个整数表示答案，答案可能很大，请输出答案除以 1000000007(即 10e+7) 的余数。

数据范围
对于 40%的评测用例，|s|≤200。
对于所有评测用例，1≤|s|≤5000。

输入样例：
((()

输出样例：
5
 */
import java.util.*;
import java.io.*;

public class j括号序列test {
	static Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    static int N = 5010;
    static int MOD = (int) 1e9 + 7;
    static char[] a = new char[N];
    static long[][] f = new long[N][N];
    static int len;

    public static void main(String[] args) {
        String s = in.next();
        len = s.length();
        for (int i = 1; i <= len; i++) {
            a[i] = s.charAt(i - 1);
        }
        long l = cacl();
        for (int i = 1; i <= len; i++) {
            if (s.charAt(len - i) == '(') {
                a[i] = ')';
            } else {
                a[i] = '(';
            }
        }
        long r = cacl();

        System.out.println(l * r % MOD);
    }

    public static long cacl() {
        for (int i = 0; i <= len; i++) {
            Arrays.fill(f[i], 0);
        }

        f[0][0] = 1;
        for (int i = 1; i <= len; i++) {
            if (a[i] == '(') {
                for (int j = 1; j <= len; j++) {
                    f[i][j] = f[i - 1][j - 1];
                }
            } else {
                f[i][0] = (f[i - 1][0] + f[i - 1][1]) % MOD;
                for (int j = 1; j <= len; j++) {
                    f[i][j] = (f[i - 1][j + 1] + f[i][j - 1]) % MOD;
                }
            }
        }
        for (int i = 0; i < len; i++) {
            if (f[len][i] > 0) {
                return f[len][i];
            }
        }
        return -1;
    }


}
